package br.com.farmabid.produto;

import java.io.DataInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.annotation.PostConstruct;
import javax.inject.Inject;

import org.apache.commons.beanutils.BeanUtils;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.observer.download.ByteArrayDownload;
import br.com.caelum.vraptor.observer.download.Download;
import br.com.caelum.vraptor.observer.upload.UploadSizeLimit;
import br.com.caelum.vraptor.observer.upload.UploadedFile;
import br.com.caelum.vraptor.view.Results;
import br.com.farmabid.cadastro.ProdutosFarmacia;
import br.com.farmabid.component.AcessSession;
import br.com.farmabid.component.StringUteis;
import br.com.farmabid.controller.BasicController;

@Controller
public class ProdutoController extends BasicController {
	@Inject ProdutoDAO produtoDAO;
	
	@Inject
    public ProdutoController(Result result, ResourceBundle bundle, AcessSession acessSession) {
		this.result = result;
		this.bundle = bundle;
		this.session = acessSession;
	}
	
	public ProdutoController(){}
	
	@PostConstruct
    private void init(){
    	injetaUsuario();
    }
	
	@Path(value = "/" + PRODUTO + "/" + GRAVAR)
	@Post
	@UploadSizeLimit(sizeLimit=40 * 1024 * 1024, fileSizeLimit=10 * 1024 * 1024)
	public void gravar(Produto produto, FormaApresentacao formasImagens, List<UploadedFile> nomeImagem){
		produto.setAtivo(1);
		if(null == produto.getId()){
			gravaNovoProduto(produto, formasImagens, nomeImagem);
		} else {
			Produto temp = (Produto) produtoDAO.find(Produto.class, produto.getId());
			List<FormaApresentacao> formasAntigas = temp.getFormas();
			try {
				BeanUtils.copyProperties(temp, produto);
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			}
			List<FormaApresentacao> list = new ArrayList<FormaApresentacao>();
			List<PrincipioAtivo> listPA = new ArrayList<PrincipioAtivo>();
			for(PrincipioAtivo pa : produto.getPrincipios()){
				pa = (PrincipioAtivo) produtoDAO.find(PrincipioAtivo.class, pa.getId());
				listPA.add(pa);
			}
			temp.setPrincipios(listPA);
			
			for(FormaApresentacao fa : produto.getFormas()){
				if(null == fa.getId()){
					fa.setProduto(temp);
					list.add(fa);
				}
			}
			for(FormaApresentacao fa : formasAntigas){
				list.addAll(existeFA(fa, produto.getFormas(), temp));
			}
			temp.setFormas(list);

			for(ProdutoImagem pi : formasImagens.getImagens()){//O array de imagens vem sempre bagunçado, então tem que achar o que é de quem.
				if(pi.getId() != null){//Se não é nulo, é só uma edição.
					pi = (ProdutoImagem) produtoDAO.find(ProdutoImagem.class, pi.getId());
				} else {
					if(pi.getArquivo() != null){//Se não tem id e tem arquivo
						if(pi.getArquivo().getFileName().equals(pi.getNomeImagem())){//Se os nomes dos arquivos são iguais.
							byte[] imgDataBa = new byte[(int)pi.getArquivo().getSize()];
							DataInputStream dataIs = new DataInputStream(pi.getArquivo().getFile());
							try {
								dataIs.readFully(imgDataBa);
							} catch (IOException e) {
								e.printStackTrace();
							}
							pi.setNomeImagem(pi.getArquivo().getFileName());
							pi.setImagem(imgDataBa);
						} else {
							System.out.println("ERRO MUITO GRAVE");
						}
					} else {
						for(ProdutoImagem pi2 : formasImagens.getImagens()){
							if(pi2.getArquivo() != null && pi2.getArquivo().getFileName().equals(pi.getNomeImagem())){
								byte[] imgDataBa = new byte[(int)pi2.getArquivo().getSize()];
								DataInputStream dataIs = new DataInputStream(pi2.getArquivo().getFile());
								try {
									dataIs.readFully(imgDataBa);
								} catch (IOException e) {
									e.printStackTrace();
								}
								pi.setNomeImagem(pi2.getArquivo().getFileName());
								pi.setImagem(imgDataBa);
							}
						}
					}
				} 
			}
			Integer i = 0;
			List<ProdutoImagem> imagensTemp2 = null;
			for(FormaApresentacao fa : temp.getFormas()){
				fa.setProduto(produto);
				fa.getImagens();
				imagensTemp2 = new ArrayList<ProdutoImagem>();
				for(ProdutoImagem pi : formasImagens.getImagens()){
					if(pi.getId() != null){//Já existe no banco
						pi = (ProdutoImagem) produtoDAO.find(ProdutoImagem.class, pi.getId());
						if(pi.getFormaApresentacao().getId() == fa.getId()){
							imagensTemp2.add(pi);
						}
					} else {
						if(fa.getId() == pi.getIndice()){
							pi.setFormaApresentacao(fa);
							imagensTemp2.add(pi);
						}
					}
				}
				fa.setImagens(imagensTemp2);
				i++;
			}
			
			if(null != produto.getInteressados() && produto.getInteressados().size() > 0){
				List<FiltroInteresseValor> listaFIV = new ArrayList<FiltroInteresseValor>();
				for(FiltroInteresseValor fiv : produto.getInteressados()){
					if(null != fiv.getId() && fiv.getId() != 0){
					listaFIV.add((FiltroInteresseValor) produtoDAO.find(FiltroInteresseValor.class, fiv.getId()));
					}
				}
				temp.setInteressados(listaFIV);
			}
			if(null != produto.getSemelhantes() && produto.getSemelhantes().size() > 0){
				list = new ArrayList<FormaApresentacao>();
				for(FormaApresentacao sem : produto.getSemelhantes()){
					sem = (FormaApresentacao) produtoDAO.find(FormaApresentacao.class, sem.getId());
					list.add(sem);
				}
				temp.setSemelhantes(list);
			}
			temp.setFabricante((Fabricante) produtoDAO.find(Fabricante.class, temp.getFabricante().getId()));
			temp.setTarja((Tarja) produtoDAO.find(Tarja.class, temp.getTarja().getId()));
			temp.setTipo((TipoProduto) produtoDAO.find(TipoProduto.class, temp.getTipo().getId()));
			temp.setTipoControle((TipoControle) produtoDAO.find(TipoControle.class, temp.getTipoControle().getId()));
			produtoDAO.update(temp);
			mensagemSucesso("sucesso.produto.atualizado");
			redirect();
		}
		
	}
	
	private void gravaNovoProduto(Produto produto, FormaApresentacao formasImagens, List<UploadedFile> nomeImagem){
		Produto temp = produtoDAO.recuperaProdutoPorNomeFabricante(produto);
		if(temp != null){
			mensagemErro("erro.produto.ja.cadastrado");
		}
		for(FormaApresentacao fa : produto.getFormas()){//Validação FA
			FormaApresentacao fatemp = produtoDAO.recuperaFormaApresentacaoPorAnvisaMsEan(fa);
			if(fatemp != null){
				mensagemErro("erro.forma.apresentacao.ja.cadastrada");
			} else {
				fatemp = produtoDAO.recuperaFormaApresentacaoPorEan(fa.getEan());
				if(fatemp != null){
					mensagemErro("erro.ean.ja.cadastrada");
				}
				fatemp = produtoDAO.recuperaFormaApresentacaoPorAnvisa(fa.getAnvisa());
				if(fatemp != null){
					mensagemErro("erro.anvisa.ja.cadastrada");
				}
				fatemp = produtoDAO.recuperaFormaApresentacaoPorCodigoMs(fa.getCodigoms());
				if(fatemp != null){
					mensagemErro("erro.codigo.ms.ja.cadastrada");
				}
				fa.setApresentacao((Apresentacao) produtoDAO.find(Apresentacao.class, fa.getApresentacao().getId()));
				fa.setCategoria((CategoriaProduto) produtoDAO.find(CategoriaProduto.class, fa.getCategoria().getId()));
				fa.setFormaUso((FormaUso) produtoDAO.find(FormaUso.class, fa.getFormaUso().getId()));
				fa.setUnidade((Unidade) produtoDAO.find(Unidade.class, fa.getUnidade().getId()));
				fa.setProduto(produto);
			}
		}
		for(ProdutoImagem pi : formasImagens.getImagens()){
			byte[] imgDataBa = new byte[(int)pi.getArquivo().getSize()];
			DataInputStream dataIs = new DataInputStream(pi.getArquivo().getFile());
			try {
				dataIs.readFully(imgDataBa);
			} catch (IOException e) {
				e.printStackTrace();
			}
			pi.setNomeImagem(pi.getArquivo().getFileName());
			pi.setImagem(imgDataBa);
		}
		Integer i = 0;
		List<ProdutoImagem> imagensTemp = null;
		for(FormaApresentacao fa : produto.getFormas()){
			fa.setProduto(produto);
			imagensTemp = new ArrayList<ProdutoImagem>();
			for(ProdutoImagem pi : formasImagens.getImagens()){
				if(i == pi.getIndice()){
					pi.setFormaApresentacao(fa);
					imagensTemp.add(pi);
				}
			}
			fa.setImagens(imagensTemp);
			i++;
		}
		if(resultPossui(ERROR) && resultPossuiConteudo(ERROR)){
    		result.include(PRODUTO, produto);
    		result.redirectTo(ProdutoController.class).novo();
    		return;
    	}
		
		List<Indicacao> listaIndicacao = new ArrayList<Indicacao>();
		for(Indicacao indi : produto.getIndicacoes()){
			listaIndicacao.add((Indicacao) produtoDAO.find(Indicacao.class, indi.getId()));
		}
		produto.setIndicacoes(listaIndicacao);
		if(null != produto.getSemelhantes() && produto.getSemelhantes().size() > 0){
			List<FormaApresentacao> listaFormaApresentacao = new ArrayList<FormaApresentacao>();
			for(FormaApresentacao sem : produto.getSemelhantes()){
				listaFormaApresentacao.add((FormaApresentacao) produtoDAO.find(FormaApresentacao.class, sem.getId()));
			}
			produto.setSemelhantes(listaFormaApresentacao);
		}
		List<PrincipioAtivo> listaPrincipio = new ArrayList<PrincipioAtivo>();
		for(PrincipioAtivo prin : produto.getPrincipios()){
			listaPrincipio.add((PrincipioAtivo) produtoDAO.find(PrincipioAtivo.class, prin.getId()));
		}
		produto.setPrincipios(listaPrincipio);
		if(null != produto.getInteressados() && produto.getInteressados().size() > 0){
			List<FiltroInteresseValor> listaFIV = new ArrayList<FiltroInteresseValor>();
			for(FiltroInteresseValor fiv : produto.getInteressados()){
				if(null != fiv.getId() && fiv.getId() != 0){
				listaFIV.add((FiltroInteresseValor) produtoDAO.find(FiltroInteresseValor.class, fiv.getId()));
				}
			}
			produto.setInteressados(listaFIV);
		}
		if(null != produto.getSemelhantes() && produto.getSemelhantes().size() > 0){
			List<FormaApresentacao> list = new ArrayList<FormaApresentacao>();
			for(FormaApresentacao sem : produto.getSemelhantes()){
				sem = (FormaApresentacao) produtoDAO.find(FormaApresentacao.class, sem.getId());
				list.add(sem);
			}
			produto.setSemelhantes(list);
		}
		
		produto.setFabricante((Fabricante) produtoDAO.find(Fabricante.class, produto.getFabricante().getId()));
		produto.setTarja((Tarja) produtoDAO.find(Tarja.class, produto.getTarja().getId()));
		produto.setTipo((TipoProduto) produtoDAO.find(TipoProduto.class, produto.getTipo().getId()));
		produto.setTipoControle((TipoControle) produtoDAO.find(TipoControle.class, produto.getTipoControle().getId()));
		produtoDAO.save(produto);
		mensagemSucesso("sucesso.produto.gravado");
		redirect();
	}
	
	private List<FormaApresentacao> existeFA(FormaApresentacao forma, List<FormaApresentacao> formasAntigas, Produto produto){
		List<FormaApresentacao> list = new ArrayList<FormaApresentacao>();
		for(FormaApresentacao fa : formasAntigas){
			if(forma.getId() == fa.getId() && fa.getId() != null){
				FormaApresentacao temp = (FormaApresentacao) produtoDAO.find(FormaApresentacao.class, fa.getId());
				 try {
					BeanUtils.copyProperties(temp, fa);
					temp.setProduto(produto);
					temp.setApresentacao((Apresentacao) produtoDAO.find(Apresentacao.class, temp.getApresentacao().getId()));
					temp.setCategoria((CategoriaProduto) produtoDAO.find(CategoriaProduto.class, temp.getCategoria().getId()));
					temp.setFormaUso((FormaUso) produtoDAO.find(FormaUso.class, temp.getFormaUso().getId()));
					temp.setUnidade((Unidade) produtoDAO.find(Unidade.class, temp.getUnidade().getId()));
					if(temp.getImagens() != null && temp.getImagens().size() > 0){
						for(ProdutoImagem pi : temp.getImagens()){
							
						}
					}
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
				list.add(temp);
			}
		}
		return list;
	}
	
	@Path("/" + PRODUTO + "/imagem/{id}")  
	public Download imagem(Integer id) {  
	     ProdutoImagem pi = (ProdutoImagem) produtoDAO.find(ProdutoImagem.class, id);  
	     return new ByteArrayDownload(pi.getImagem(), "image/png", pi.getNomeImagem());  
	}
	
	@Path(value = "/" + PRODUTO + "/" + NOVO)
	public void novo() {
		if(!resultPossui(PRODUTO)){
			result.include("produto", new Produto());
		}
		result.include("listaCategoria", produtoDAO.recuperaTodos(CategoriaProduto.class));
		result.include("listaFabricante", produtoDAO.recuperaTodos(Fabricante.class));
		result.include("listaTipo", produtoDAO.recuperaTodos(TipoProduto.class));
		result.include("listaUnidade", produtoDAO.recuperaTodos(Unidade.class));
		result.include("listaTarja", produtoDAO.recuperaTodos(Tarja.class));
		result.include("listaApresentacao", produtoDAO.recuperaTodos(Apresentacao.class));
		result.include("listaControle", produtoDAO.recuperaTodos(TipoControle.class));
		result.include("listaFormaUso", produtoDAO.recuperaTodos(FormaUso.class));
		result.include("listaTamanho", produtoDAO.recuperaTodos(Tamanho.class));
		result.include("listaFiltrosInteresse", produtoDAO.recuperaTodos(FiltroInteresse.class));
	}
	
	@Path(value = "/" + PRODUTO + "/filtrosInteresse")
	public void filtrosInteresse() {
		if(!resultPossui(PRODUTO)){
			result.include("produto", new Produto());
		}
	}
	
	@Path(value = "/" + PRODUTO + "/recuperaFiltrosInteresse")
	@Post
	public void recuperaFiltrosInteresse(Integer produtoId){
		Produto temp = (Produto) produtoDAO.find(Produto.class, produtoId);
		List<FiltroInteresse> filtros =  (List<FiltroInteresse>) produtoDAO.recuperaTodos(FiltroInteresse.class);
		result.include("produto", temp);
		result.include("listaFiltrosInteresse", filtros);
		result.redirectTo(ProdutoController.class).filtrosInteresse();
	}
	
	@Path(value = "/" + PRODUTO + "/gravarFiltrosInteresse")
	@Post
	public void gravarFiltrosInteresse(Produto produto){
		Produto temp = (Produto) produtoDAO.find(Produto.class, produto.getId());
		temp.setInteressados(produto.getInteressados());
		produtoDAO.update(temp);
		mensagemSucesso("sucesso.filtros.interesse.gravados");
		result.redirectTo(ProdutoController.class).filtrosInteresse();
	}
	
	@Path(value = "/" + PRODUTO + "/recuperaProdutoPorNome")
    @Get
	public void recuperaProdutoPorNome(String query){
		List<Produto> lista = produtoDAO.recuperaProdutosPorNomeLike(query);
		List<ProdutoVO> listaProdutoVO = new ArrayList<ProdutoVO>();
		for(Produto prod : lista){
			listaProdutoVO.addAll(produtoDAO.converteProdutoParaProdutoVO(prod));
		}
		result.use(Results.json()).from(listaProdutoVO, "listaProdutos").serialize();
	}
	
	@Path(value = "/" + PRODUTO + "/" + EDITAR + "/{id}")
	public void editar(String id) {
		Produto prod = (Produto) produtoDAO.find(Produto.class, Integer.parseInt(id));
		prod.getFormas();
		prod.getIndicacoes();
		prod.getPrincipios();
		prod.getSemelhantes();
		for(FormaApresentacao fa : prod.getFormas()){
			fa.getImagens();
		}
		result.include("produto", prod);
		result.include("listaCategoria", produtoDAO.recuperaTodos(CategoriaProduto.class));
		result.include("listaFabricante", produtoDAO.recuperaTodos(Fabricante.class));
		result.include("listaTipo", produtoDAO.recuperaTodos(TipoProduto.class));
		result.include("listaUnidade", produtoDAO.recuperaTodos(Unidade.class));
		result.include("listaTarja", produtoDAO.recuperaTodos(Tarja.class));
		result.include("listaApresentacao", produtoDAO.recuperaTodos(Apresentacao.class));
		result.include("listaControle", produtoDAO.recuperaTodos(TipoControle.class));
		result.include("listaFormaUso", produtoDAO.recuperaTodos(FormaUso.class));
		result.include("listaTamanho", produtoDAO.recuperaTodos(Tamanho.class));
		result.include("listaFiltrosInteresse", produtoDAO.recuperaTodos(FiltroInteresse.class));
	}
	
	@Path(value = "/" + PRODUTO + "/recuperaSemelhantes")
	@Post
	public void recuperaSemelhantes(String nome){
		List<Produto> lista = produtoDAO.recuperaProdutosPorNomeLike(nome);
		List<ProdutoVO> listaProdutoVO = new ArrayList<ProdutoVO>();
		for(Produto prod : lista){
			listaProdutoVO.addAll(produtoDAO.converteProdutoParaProdutoVO(prod));
		}
		result.use(Results.json()).from(listaProdutoVO, "listaSemelhantes").serialize();
	}
	
	@Path(value = "/" + PRODUTO + "/recuperaIndicacoes")
	@Post
	public void recuperaIndicacoes(String nome){
		List<Indicacao> lista = produtoDAO.recuperaIndicacaoPorNomeLike(nome);
		result.use(Results.json()).from(lista, "listaIndicacao").serialize();
	}
	
	@Path(value = "/" + PRODUTO + "/recuperaPrincipios")
	@Post
	public void recuperaPrincipios(String nome){
		List<PrincipioAtivo> lista = produtoDAO.recuperaPrincipioPorNomeLike(nome);
		result.use(Results.json()).from(lista, "listaPrincipioAtivo").serialize();
	}
	
    @Path(value = "/" + PRODUTO)
	public void produto(Integer quantidadeRegistros, Integer pagina) {
    	List<FormaApresentacao> listaProdutos = (List<FormaApresentacao>) produtoDAO.recuperaProdutos(null, null);
    	result.include("totalRegistros", listaProdutos.size());
    	listaProdutos = (List<FormaApresentacao>) produtoDAO.recuperaProdutos(pagina, quantidadeRegistros);
    	result.include("listaProdutos", listaProdutos);
    	if(pagina == null){
    		pagina = 1;
    	}
    	result.include("pagina", pagina);
    	Integer totalPaginas = 1;
    	if(quantidadeRegistros != null){
    		totalPaginas =  ( listaProdutos.size() + (quantidadeRegistros - 1) ) / quantidadeRegistros;
    	}
		result.include("totalPaginas", totalPaginas);
    }
    
    @Path(value = "/" + PRODUTO + "/solicitar")
	public void solicitar() {}
    
    @Path(value = "/" + PRODUTO + "/farmacia")
	public void farmacia(Produto produto, FormaApresentacao formaApresentacao, Integer quantidadeRegistros, Integer pagina) {
    	List<FormaApresentacao> listaProdutos = null;
    	if(formaApresentacao != null){
    		if(!StringUteis.isEmpty(formaApresentacao.getAnvisa())){//Filtro código ANVISA
    			listaProdutos = produtoDAO.recuperaFormaApresentacaoPorAnvisaLike(formaApresentacao);
    		}
    		if(!StringUteis.isEmpty(formaApresentacao.getEan())){//Filtro código ean
    			listaProdutos = produtoDAO.recuperaFormaApresentacaoPorEanLike(formaApresentacao);
    		}
    		if(!StringUteis.isEmpty(formaApresentacao.getCodigoms())){//Filtro código ms
    			listaProdutos = produtoDAO.recuperaFormaApresentacaoPorMsLike(formaApresentacao);
    		}
    		
    		if(null != listaProdutos && listaProdutos.size() > 0){
    			result.include("totalRegistros", listaProdutos.size());
	    		trataProdutoOfertados(listaProdutos);
	    		if(pagina == null){
		    		pagina = 1;
		    	}
	    		//TODO consertar essa paginação
		    	result.include("pagina", pagina);
		    	Integer totalPaginas = 1;
		    	if(quantidadeRegistros != null){
		    		totalPaginas =  ( listaProdutos.size() + (quantidadeRegistros - 1) ) / quantidadeRegistros;
		    	}
				result.include("totalPaginas", totalPaginas);
				result.include("produto", new Produto());
				result.include("formaApresentacao", formaApresentacao);
	    	}
    	}
    	if(produto != null && !StringUteis.isEmpty(produto.getNome())){//Filtro nome produto
    		List<Produto> listaProd = produtoDAO.recuperaProdutosPorNomeLike(produto.getNome());
    		if(listaProd != null && listaProd.size() > 0){
    			listaProdutos = new ArrayList<FormaApresentacao>();
    			for(Produto p : listaProd){
		    		if(null != p.getFormas() && p.getFormas().size() > 0){
		    			listaProdutos.addAll(p.getFormas());
			    	}
    			}
    			if(null != listaProdutos && listaProdutos.size() > 0){
    				result.include("totalRegistros", listaProdutos.size());
    				trataProdutoOfertados(listaProdutos);
    			}
	    		if(pagina == null){
		    		pagina = 1;
		    	}
		    	result.include("pagina", pagina);
		    	Integer totalPaginas = 1;
		    	if(quantidadeRegistros != null){
		    		totalPaginas =  ( listaProdutos.size() + (quantidadeRegistros - 1) ) / quantidadeRegistros;
		    	}
				result.include("totalPaginas", totalPaginas);
				result.include("produto", produto);
				result.include("formaApresentacao", new FormaApresentacao());
    		}
    	}
    	
    	if((produto == null || StringUteis.isEmpty(produto.getNome())) 
    		&& (formaApresentacao == null || StringUteis.isEmpty(formaApresentacao.getAnvisa()))
    		&& (formaApresentacao == null || StringUteis.isEmpty(formaApresentacao.getCodigoms()))
    		&& (formaApresentacao == null || StringUteis.isEmpty(formaApresentacao.getEan()))){//Sem filtro
	    	listaProdutos = (List<FormaApresentacao>) produtoDAO.recuperaProdutos(null, null);
	    	result.include("totalRegistros", listaProdutos.size());
	    	listaProdutos = (List<FormaApresentacao>) produtoDAO.recuperaProdutos(pagina, quantidadeRegistros);
	    	if(null != listaProdutos && listaProdutos.size() > 0){
	    		trataProdutoOfertados(listaProdutos);
	    	}
	    	
	    	if(pagina == null){
	    		pagina = 1;
	    	}
	    	result.include("pagina", pagina);
	    	Integer totalPaginas = 1;
	    	if(quantidadeRegistros != null){
	    		totalPaginas =  ( listaProdutos.size() + (quantidadeRegistros - 1) ) / quantidadeRegistros;
	    	}
			result.include("totalPaginas", totalPaginas);
			result.include("produto", new Produto());
			result.include("formaApresentacao", new FormaApresentacao());
    	}
    	result.include("listaProdutos", listaProdutos);
    	if(listaProdutos == null || listaProdutos.size() == 0){//Lista vazia
    		result.include("totalPaginas", 0);
    		result.include("pagina", 0);
    		result.include("totalRegistros", 0);
    		result.include("produto", new Produto());
			result.include("formaApresentacao", new FormaApresentacao());
    		mensagem("alert.nenhum.produto.encontrado.com.filtro");
    	}
    }

	private void trataProdutoOfertados(List<FormaApresentacao> listaProdutos) {
		for(FormaApresentacao fa : listaProdutos){
			if(null != session.getFarmacia()){
				session.getFarmacia().getListaProdutos();
				for(ProdutosFarmacia pf : session.getFarmacia().getListaProdutos()){
					if(pf.getFormaApresentacao().getId() == fa.getId()){
						fa.setFarmaciaOfertou(true);
						fa.setValorAlvo(pf.getValorAlvo());
						fa.setValorMinimo(pf.getValorMinimo());
						fa.setQuantidadeOfertada(pf.getQuantidade());
						if(pf.getOfertar().intValue() == 0){
							fa.setEncarte(false);
						} else {
							fa.setEncarte(true);
						}
						break;
					}
				}
			}
		}
	}
    
    @Path(value = "/" + PRODUTO + "/gravarProdutoFarmacia")
    @Post
    public void gravarProdutoFarmacia(ProdutosFarmacia produtosFarmacia, String ofertar){
    	produtosFarmacia.setFarmacia(session.getFarmacia());
    	 if("S".equals(ofertar)){
    		 produtosFarmacia.setOfertar(1);
         } else {
        	 produtosFarmacia.setOfertar(0);
         }
    	 if(null == produtosFarmacia.getId()){
    		 produtoDAO.save(produtosFarmacia);
    		 session.getFarmacia().getListaProdutos().add(produtosFarmacia);
    	 } else {
    		 produtoDAO.update(produtosFarmacia);
    	 }
    	 
    	result.use(Results.json()).from(recuperaMensagem("sucesso.produto.ofertado"), "mensagem").serialize();
    }
    
    @Path(value = "/" + PRODUTO + "/gravarSolicitacao")
    @Post
    @UploadSizeLimit(sizeLimit=40 * 1024 * 1024, fileSizeLimit=10 * 1024 * 1024)
	public void gravarSolicitacao(Solicitacao solicitacao, UploadedFile file) {
    	if(file != null){
    		byte[] imgDataBa = new byte[(int)file.getSize()];
    		DataInputStream dataIs = new DataInputStream(file.getFile());
    		try {
    			dataIs.readFully(imgDataBa);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		solicitacao.setImagem(imgDataBa);
    		solicitacao.setNomeImagem(file.getFileName());
    	}
		produtoDAO.save(solicitacao);
		mensagemSucesso("sucesso.solicitacao.enviada");
		result.redirectTo(ProdutoController.class).farmacia(null, null, null, null);
    }

	@Override
	protected void redirect() {
		result.redirectTo(ProdutoController.class).produto(null, null);
	}

}